231018 HopeLend

Abstract

2023 年 10 月 18 日,在 Ethereum 上发生的一起攻击事件,损失了大约 528 ETH。

Background

HopeLend

HopeLend is a decentralized non-custodial lending protocol with multiple liquidity pools. (Like Aave)

In simple terms, users can deposit underlying assets to provide liquidity. When this liquidity generates income through lending, a portion of the earnings is distributed to the liquidity providers.

hTokens 和 dTokens

Vulnerabilities

Pool Liquidity

利用 Hopelend 的 hEthWBTC 交易池中的流动性不足,通过人为手段来抬高 hEthWBTC 的价值。随后,黑客利用借贷功能从池中取走所有代币(HOPE、stHOPE、wstETH、WETH、USDT、USDC)。

Precision Loss

利用 Aave 中的闪电贷功能,通过函数 rayDiv 的精度损失漏洞,将借入的 2000 个 WBTC 转移到 Hopelend 中,从而清空了黑客在攻击早期投入的所有 WBTC。(与 230415 Hundred Finance 的问题比较类似,都是 hTokens 和 underlying asserts 之间的换算公式存在精度误差)

问题合约地址:https://etherscan.io/address/0x1c2220437b068a8c124ac1d158f7f786fbea701e

Pasted image 20231114110207.png

Attack Process

抬高 LiquidityIndex

首先,Attacker 利用 Aave 闪贷 2300 WBTC,随后向 HopeLend 中存入 2000 WBTC,并获得交易池为其铸造的 2000 hEthWBTC。

Pasted image 20231114111741.png

后攻击者又向 HopeLend 闪贷了 2,000 WBTC,并通过 executeOperation 函数,在接收 2,000 WBTC 后,又将这 2,000 WBTC 存入 HopeLend,随即取出 1,999.99999999 WBTC。最终,HopeLend 池子中只剩下 0.00000001 WBTC 作为 Underlying Token。

Pasted image 20231114114230.png

通过反复执行 Flashloan 操作,攻击者可以逐渐将 hEthWBTC 的价值提高( #🚧/3 主要原因是其池子初始为空,通过利率计算公式可以达到「指数」提升的效果,但是具体的数学过程仍有待研究)

Pasted image 20231114121111.png
Pasted image 20231114115835.png

最终,0.00000001 hEthWTBC 可以兑换 75.60000001 WBTC。

舍入误差套取高额利润

此时,攻击者将池子中的所有代币全部借出:
Pasted image 20231114122706.png

利用上文提到的 舍入漏洞,Attacker 在取出 113.4 WBTC 时,只需要消耗 0.00000001 的 hEthWBTC。

Pasted image 20231201143638.png

Pasted image 20231114133446.png

同时,攻击者只需要存入 75.6 WBTC 即可获得 0.00000001 的 hEthWBTC。

重复操作,就可以将池子中的 WBTC 全部兑换出来。

References